package com.fpmsa.officeweb.controller;

import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.weixin4j.Configuration;
import org.weixin4j.Weixin;
import org.weixin4j.WeixinException;
import org.weixin4j.pay.JsApiTicket;
import org.weixin4j.pay.SignUtil;

import java.util.UUID;

/**
 * @Auther: Huang Yuehong
 * @Description:
 * @Date: 2018/8/9 09:41
 */
@Controller
public class WechatController {

    @GetMapping("/wx/getWxConfig")
    @ResponseBody
    public JSONObject getWxConfig(@RequestParam("url") String url) throws WeixinException {
        Weixin weixin = new Weixin();
        //登录微信获取Access_Token
        weixin.login(Configuration.getOAuthAppId(), Configuration.getOAuthSecret());
        //weixin.login("wx127fbb10e558c7f4", "0bde34afa31622d0d9a41408bfa7390d");

        //定义返回配置JSON对象
        JSONObject config = new JSONObject();

        //获取微信js-sdk开发ticket
        //注意，jsapi_ticket，有效期7200秒，开发者必须在自己的服务全局缓存jsapi_ticket
        //请自行保存到缓存
        //本示例仅演示获取流程
        JsApiTicket jsApiTicket = weixin.getJsApi_Ticket();

        //获得jsapi_ticket之后，就可以生成JS-SDK权限验证的签名了。
        //签名算法
        //签名生成规则如下：
        //参与签名的字段包括noncestr（随机字符串）,有效的jsapi_ticket, timestamp（时间戳）, url（当前网页的URL，不包含#及其后面部分）。
        //对所有待签名参数按照字段名的ASCII 码从小到大排序（字典序）后，使用URL键值对的格式（即key1=value1&key2=value2…）拼接成字符串string1。
        //这里需要注意的是所有参数名均为小写字符。
        //对string1作sha1加密，字段名和字段值都采用原始值，不进行URL转义。
        //对应我们weixin4j的开发，则已经把签名算法写好了
        String noncestr = UUID.randomUUID().toString().substring(0, 15);
        String timestamp = System.currentTimeMillis() + "";
        //注：本链接仅作为演示，实际链接请以自己业务链接为主
        String signature = SignUtil.getSignature(jsApiTicket.getTicket(), noncestr, timestamp, url);

        //返回wx.config参数
        config.put("appId", Configuration.getOAuthAppId());
        config.put("timestamp", timestamp);
        config.put("nonceStr", noncestr);
        config.put("signature", signature);
        return config;
    }


}
